package org.learn.mq.rabbit.workqueue;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;
import lombok.extern.slf4j.Slf4j;

/**
 * <一句话描述>
 *
 * @author xianglujun
 * @date 2019/7/8 14:52
 */
@Slf4j
public class NewTask {

    private static final String QUEUE_NAME = "hello";

    public static void main(String[] args) {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.172.128");
        try {
            // 创建一个rabbitmq链接对象
            Connection connection = factory.newConnection();
            // 创建Channel对象, 该channel对象, 不需要我们显式的执行关闭操作
            Channel channel = connection.createChannel();

            // 创建queue, 并向该queue发送消息, 对于queue的创建, 只有在
            // queue不存在时, 才会创建queue
            channel.queueDeclare(QUEUE_NAME, true, false, false, null);

            // 通过命令行的方式传输数据
            String message = String.join(" ", args);

            // 发送消息, 发送持久化消息
            // 这种持久化的方式并不能完全保证消息一定不会丢失
            // 1. RabbitMQ在接收到消息到磁盘上会有一定的时间间隔
            // 2. RabbitMQ在具体写入的时候, 可能会采用不同的策略, 并不是所有的消息都会写入到磁盘, 有部分数据可能会写入到cache中, 这时一样会导致
            // 消息的丢失。
            channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());

            System.out.println("[x] Sent '" + message +"'");
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }
}
